/**
 ****************************************
 * @file task_schedule.h
 * @author: AnRui
 * @version 0.1
 * @date  : 2025-11-10
 * @copyright Copyright (c) 2025
 * @desc: 裸机的任务调度
 *
 * ***************************************
 */
#ifndef __TASK_SCHEDUEL_H__
#define __TASK_SCHEDUEL_H__
#include "systick.h"
#include <string.h>
#include "gd32f30x.h"
#include <stdint.h> 
 // 注册宏
#define TASK_REG(task_name,relod_time,callback_func)  TaskDrvReg(#task_name,relod_time,callback_func)
#define Task_MAX_NUM 100        //任务列表中任务数量最大值 
typedef enum {
    TASK_SUSPENDED = 0,
    TASK_ACTIVE,
} TaskStateEnum;

typedef enum {
    TASK_SUCCESS = 0,  //成功
    TASK_LIST_FULL,    //任务列表已满
    TASK_NAME_ERROR,  //任务名不正确
}TaskErrorCode;


typedef struct {
    char* taskName;    //任务名称
    TaskStateEnum taskScheduleFlag;      // 调度标志，1：调度，0：挂起
    uint16_t taskTimCount;              // 时间片计数值
    uint16_t taskTimRload;              // 时间片重载值
    void (*pTaskFuncCb)(void);          // 函数指针变量，用来保存业务功能模块函数地址
} TaskStruct;


/**
 * @desc  : 任务注册函数
 * @date  : 2025-03-28
 * @author: AnRui
 * @param : taskName - {参数说明}: 任务名
 * @param : taskTimRload - {参数说明}: 时间片重载值(多久执行一次)
 * @param : pTaskFuncCb - {参数说明}:  任务对应的执行函数(函数中不要出现delay)
 * @note  : 向任务列表中添加任务
 */
TaskErrorCode TaskDrvReg(char* taskName, uint16_t taskTimRload, void (*pTaskFuncCb)(void));


/**
 * @desc  : 开启任务调度
 * @date  : 2025-03-28
 * @author: AnRui
 * @note  : 逐一检查任务列表 如果任务处于调度状态就执行对应的函数 缺少优先级
 */
void TaskDrvStartSchedule(void);

/**
 * @desc  : 任务调度器初始化
 * @date  : 2025-03-28
 * @author: AnRui
 * @note  : 向滴答定时器 注册任务调度函数
 */
void TaskDrvInit(void);



#endif // __TASK_DRV_H__
